MySQL Huge Page
概述:
有些硬件或操作系统支持大于默认值的内存页(通常为4KB),这个时取决于底层硬件和操作系统.执行大页内存可以检查设备缓冲区的丢失.也可以改进性能.
-
MySQL 使用Innodb 可以使用大页内存为缓冲池和额外的内存池分配内存.
-
MySQL 可以使用大页内存最大为4M ,在Solaris 下可以允许使用256m 内存的页面.
-
MySQL 支持Linux 下的大页内存,Linux 称为 HugeTLB
-
一般操作系统都启用了大页内存功能.
1.1. 检查是否支持大页内存
[root@dbserver ~]# cat /proc/meminfo | grep -i huge
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
上面的值是表示内核支持大页内存,但是为0 没有使用配置页面.
::: alert-info
如果没有启用大页内存 请查看hugetlbpage.txt
文档来支持.
:::
1.2. 配置大页内存脚本
如果你的Linux 内核开启了大页面支持,请将以下脚本放入/etc/rc.local文件中. 并附加执行权限.
- 配置脚本
# 2. Set the number of pages to be used.
# 3. Each page is normally 2MB, so a value of 2000 = 4000MB.
# 4. This command actually allocates memory, so this much
# 5. memory must be available.
# 2.设置使用的页数,每个页如果是2MB ,所以总和就为4000 MB.
echo 20000 > /proc/sys/vm/nr_hugepages
# 6. Set the group number that is permitted to access this
# 7. memory (102 in this case). The mysql user must be a
# 8. member of this group.
# 设置访问大页内存的操作系统的用户组ID ,mysql user 必须在这个组内.
echo 1000 > /proc/sys/vm/hugetlb\_shm\_group
# 9. Increase the amount of shmem permitted per segment
# 10. (12G in this case).
# 单位为字节:计算方式8*1024*1024*1024=
echo 8589934592 > /proc/sys/kernel/shmmax
# 11. Increase total amount of shared memory. The value
# 12. is the number of pages. At 4KB/page, 4194304 = 16GB.
# 单位为页:计算方式:2097152*4k/1024/1024=8G
echo 2097152 > /proc/sys/kernel/shmall
- 添加执行权限
chmod +x /etc/rc.local
:::alert-warning
否则不会生效
:::
::: alert-info
对于MySQL 服务器,通常shmax
和 shmmax
最好是非常接近.
:::
1.3. 重启操作系统
1.4. 验证大页内存开启.
[root@mysql1 ~]# cat /proc/meminfo | grep -i huge
AnonHugePages: 18432 kB
HugePages_Total: 3682
HugePages_Free: 3682
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
1.5. mysql 用户的内存限制
配置MySQL 的内存无限制.请编辑/etc/security/limits.conf
文件.添加以下命令.
mysql hard memlock unlimited
mysql soft memlock unlimited
1.6. 激活MySQL 的大页内存
MySQL 默认内存大页面支持默认不开启. 请在配置文件中激活.
[mysqld]
large-pages
:::alert-warning
开启了这个选项.innodb 将会自动为缓冲池和额外的内存池使用大页面.如果不能使用大页面则将使用传统内存,并发出警告.
:::
1.7. 重启MySQL 观察页面使用情况.
[root@mysql1 ~]# cat /proc/meminfo | grep -i huge
AnonHugePages: 14336 kB
HugePages_Total: 3682
HugePages_Free: 3677
HugePages_Rsvd: 65
HugePages_Surp: 0
Hugepagesize: 2048 kB